{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true,
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "使用AdaBoost解决分类问题\n",
    "\n",
    "数据集：白酒数据，共有13个特征"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.preprocessing import LabelEncoder\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn.ensemble import AdaBoostClassifier\n",
    "from sklearn.metrics import accuracy_score"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Class labels [1 2 3]\n"
     ]
    }
   ],
   "source": [
    "cwd = '/home/xijian/pycharm_projects/Magic-NLPer/MachineLearning/'\n",
    "data_dir = cwd+'RandomForest随机森林/data/'\n",
    "\n",
    "# Wine dataset and rank the 13 features by their respective importance measures\n",
    "df_wine = pd.read_csv(data_dir+'wine.data',\n",
    "                      header=None,\n",
    "                      names=['Class label', 'Alcohol', 'Malic acid', 'Ash', 'Alcalinity of ash', 'Magnesium',\n",
    "                               'Total phenols', 'Flavanoids', 'Nonflavanoid phenols', 'Proanthocyanins', 'Color intensity',\n",
    "                               'Hue', 'OD280/OD315 of diluted wines', 'Proline'])\n",
    "print('Class labels', np.unique(df_wine['Class label'])) # 一共有3个类\n",
    "\n",
    "df_wine = df_wine[df_wine['Class label']!=1] # 去掉一个类\n",
    "\n",
    "y = df_wine['Class label'].values\n",
    "X = df_wine[['Alcohol', 'OD280/OD315 of diluted wines']].values"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Class labels [0 1]\n",
      "numbers of features: 2\n"
     ]
    },
    {
     "data": {
      "text/plain": "(95, 2)"
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "le = LabelEncoder()\n",
    "y = le.fit_transform(y)\n",
    "\n",
    "print('Class labels', np.unique(y))\n",
    "print('numbers of features:', X.shape[1])\n",
    "\n",
    "# 划分训练集测试集\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1, stratify=y)\n",
    "X_train.shape\n"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Decision tree train/test accuracies 0.916/0.875\n"
     ]
    }
   ],
   "source": [
    "# 先使用决策树做分类，作为GBDT的对比参照\n",
    "tree = DecisionTreeClassifier(criterion='entropy',\n",
    "                              random_state=1,\n",
    "                              max_depth=1)\n",
    "tree = tree.fit(X_train, y_train)\n",
    "y_train_pred = tree.predict(X_train)\n",
    "y_test_pred = tree.predict(X_test)\n",
    "tree_train = accuracy_score(y_train, y_train_pred)\n",
    "tree_test = accuracy_score(y_test, y_test_pred)\n",
    "print('Decision tree train/test accuracies %.3f/%.3f' % (tree_train, tree_test))"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "outputs": [],
   "source": [
    "# 绘制决策边界\n",
    "def plot_decision_regions(X, y, classifier_list, classifier_names):\n",
    "    x_min = X[:, 0].min() - 1\n",
    "    x_max = X[:, 0].max() + 1\n",
    "    y_min = X[:, 1].min() - 1\n",
    "    y_max = X[:, 1].max() + 1\n",
    "\n",
    "    xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1),\n",
    "    np.arange(y_min, y_max, 0.1))\n",
    "\n",
    "    f, axarr = plt.subplots(1, 2, sharex='col', sharey='row', figsize=(8, 3))\n",
    "\n",
    "    for idx, clf, tt in zip([0, 1],classifier_list,classifier_names):\n",
    "        clf.fit(X, y)\n",
    "        Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])\n",
    "        Z = Z.reshape(xx.shape)\n",
    "        axarr[idx].contourf(xx, yy, Z, alpha=0.3)\n",
    "        axarr[idx].scatter(X[y==0, 0], X[y==0, 1], c='blue', marker='^')\n",
    "        axarr[idx].scatter(X[y==1, 0], X[y==1, 1], c='red', marker='o')\n",
    "        axarr[idx].set_title(tt)\n",
    "        axarr[0].set_ylabel('Alcohol', fontsize=12)\n",
    "\n",
    "    plt.text(10.2, -0.5, s='OD280/OD315 of diluted wines', ha='center', va='center', fontsize=12)\n",
    "    plt.show()"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "AdaBoost train/test accuracies 1.000/0.917\n"
     ]
    }
   ],
   "source": [
    "ada = AdaBoostClassifier(base_estimator=tree,\n",
    "                         n_estimators=500,\n",
    "                         learning_rate=0.1,\n",
    "                         random_state=1)\n",
    "ada = ada.fit(X_train, y_train)\n",
    "y_train_pred = ada.predict(X_train)\n",
    "y_test_pred = ada.predict(X_test)\n",
    "ada_train = accuracy_score(y_train, y_train_pred)\n",
    "ada_test = accuracy_score(y_test, y_test_pred)\n",
    "print('AdaBoost train/test accuracies %.3f/%.3f' % (ada_train, ada_test))"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 576x216 with 2 Axes>",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_decision_regions(X_train, y_train, [tree, ada], ['Decision Tree', 'AdaBoost'])"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "其实使用AdaBoost+DecisionTree分类树 基本就实现了GBDT分类问题"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}